const APP_ACTION = {
  TYPE_GET_LOCATION: "activeLocation",
  TYPE_START_INTERVAL_LOCATION: "startIntervalLocation",
  TYPE_STOP_INTERVAL_LOCATION: "stopIntervalLocation",
  TYPE_START_INTERVAL_COMPASS: "startIntervalCompass",
  TYPE_STOP_INTERVAL_COMPASS: "stopIntervalCompass",
  TYPE_START_NAVIGATION: "startNavigation",
  TYPE_STOP_NAVIGATION: "stopNavigation",
  TYPE_PREVIEW_DOCUMENT: "openOffice",
  TYPE_PRINT: "consoleLog",
  TYPE_GET_TOKEN: "getToken",
  TYPE_REFRESH_TOKEN: "refreshToken",
  TYPE_CHOSE_LOCATION: "chooseLocation",
  TYPE_GO_BACK: "goBack",
  TYPE_START_FULL_SCREEN: "startFullScreen",
  TYPE_STOP_FULL_SCREEN: "stopFullScreen",
  TYPE_DELETE: "delete",
  TYPE_GET_MEDIA: "getMedia",
  TYPE_GET_IMG_BASE64: "getImgBase64", 
  TYPE_GET_FILE: "getFile",
  TYPE_CALL_PHONE: "callPhone",
  TYPE_SEND_SMS: "sendSMS",
  TYPE_SEND_EMAIL: "sendEmail",
  TYPE_SCAN_QRCODE: "scanQRCode",
  TYPE_GET_NETTYPE: "getNetType",
  TYPE_ADDR_PARSE: "parseAddr",
  TYPE_START_RECORD:'startRecord',
  TYPE_STOP_RECORD:'stopRecord',
  TYPE_DOWNLOAD_FILE:"downloadFile",
  TYPE_UPLOAD_FILE:'uploadFile'
};


const FLAG_INTERVAL = "_interval";
const TIMEOUT_CALL = 20000;

var whJSBridge = {};
!(function (e, n) {
  "object" == typeof exports && "undefined" != typeof module
    ? (module.exports = n())
    : "function" == typeof define && define.amd
    ? define(n)
    : ((e = e || self).webUni = n());
})(this, function () {
  "use strict";
  try {
    var e = {};
    Object.defineProperty(e, "passive", {
      get: function () {
        !0;
      },
    }),
      window.addEventListener("test-passive", null, e);
  } catch (e) {}
  var n = Object.prototype.hasOwnProperty;
  function i(e, i) {
    return n.call(e, i);
  }
  var t = [];
  function o() {
    return window.__dcloud_weex_postMessage || window.__dcloud_weex_;
  }
  function a() {
    return window.__uniapp_x_postMessage || window.__uniapp_x_;
  }
  var r = function (e, n) {
      var i = { options: { timestamp: +new Date() }, name: e, arg: n };
      if (a()) {
        if ("postMessage" === e) {
          var r = { data: n };
          return window.__uniapp_x_postMessage
            ? window.__uniapp_x_postMessage(r)
            : window.__uniapp_x_.postMessage(JSON.stringify(r));
        }
        var d = {
          type: "WEB_INVOKE_APPSERVICE",
          args: { data: i, webviewIds: t },
        };
        window.__uniapp_x_postMessage
          ? window.__uniapp_x_postMessageToService(d)
          : window.__uniapp_x_.postMessageToService(JSON.stringify(d));
      } else if (o()) {
        if ("postMessage" === e) {
          var s = { data: [n] };
          return window.__dcloud_weex_postMessage
            ? window.__dcloud_weex_postMessage(s)
            : window.__dcloud_weex_.postMessage(JSON.stringify(s));
        }
        var w = {
          type: "WEB_INVOKE_APPSERVICE",
          args: { data: i, webviewIds: t },
        };
        window.__dcloud_weex_postMessage
          ? window.__dcloud_weex_postMessageToService(w)
          : window.__dcloud_weex_.postMessageToService(JSON.stringify(w));
      } else {
        if (!window.plus)
          return window.parent.postMessage(
            { type: "WEB_INVOKE_APPSERVICE", data: i, pageId: "" },
            "*"
          );
        if (0 === t.length) {
          var u = plus.webview.currentWebview();
          if (!u) throw new Error("plus.webview.currentWebview() is undefined");
          var g = u.parent(),
            v = "";
          (v = g ? g.id : u.id), t.push(v);
        }
        if (plus.webview.getWebviewById("__uniapp__service"))
          plus.webview.postMessageToUniNView(
            { type: "WEB_INVOKE_APPSERVICE", args: { data: i, webviewIds: t } },
            "__uniapp__service"
          );
        else {
          var c = JSON.stringify(i);
          plus.webview
            .getLaunchWebview()
            .evalJS(
              'UniPlusBridge.subscribeHandler("'
                .concat("WEB_INVOKE_APPSERVICE", '",')
                .concat(c, ",")
                .concat(JSON.stringify(t), ");")
            );
        }
      }
    },
    d = {
      navigateTo: function () {
        var e =
            arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
          n = e.url;
        r("navigateTo", { url: encodeURI(n) });
      },
      navigateBack: function () {
        var e =
            arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
          n = e.delta;
        r("navigateBack", { delta: parseInt(n) || 1 });
      },
      switchTab: function () {
        var e =
            arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
          n = e.url;
        r("switchTab", { url: encodeURI(n) });
      },
      reLaunch: function () {
        var e =
            arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
          n = e.url;
        r("reLaunch", { url: encodeURI(n) });
      },
      redirectTo: function () {
        var e =
            arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
          n = e.url;
        r("redirectTo", { url: encodeURI(n) });
      },
      getEnv: function (e) {
        a()
          ? e({ uvue: !0 })
          : o()
          ? e({ nvue: !0 })
          : window.plus
          ? e({ plus: !0 })
          : e({ h5: !0 });
      },
      postMessage: function () {
        var e =
          arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
        r("postMessage", e.data || {});
      },
    },
    s = /uni-app/i.test(navigator.userAgent),
    w = /Html5Plus/i.test(navigator.userAgent),
    u = /complete|loaded|interactive/;
  var g =
    window.my &&
    navigator.userAgent.indexOf(
      ["t", "n", "e", "i", "l", "C", "y", "a", "p", "i", "l", "A"]
        .reverse()
        .join("")
    ) > -1;
  var v =
    window.swan && window.swan.webView && /swan/i.test(navigator.userAgent);
  var c =
    window.qq &&
    window.qq.miniProgram &&
    /QQ/i.test(navigator.userAgent) &&
    /miniProgram/i.test(navigator.userAgent);
  var p =
    window.tt &&
    window.tt.miniProgram &&
    /toutiaomicroapp/i.test(navigator.userAgent);
  var _ =
    window.wx &&
    window.wx.miniProgram &&
    /micromessenger/i.test(navigator.userAgent) &&
    /miniProgram/i.test(navigator.userAgent);
  var m = window.qa && /quickapp/i.test(navigator.userAgent);
  var f =
    window.ks &&
    window.ks.miniProgram &&
    /micromessenger/i.test(navigator.userAgent) &&
    /miniProgram/i.test(navigator.userAgent);
  var l =
    window.tt &&
    window.tt.miniProgram &&
    /Lark|Feishu/i.test(navigator.userAgent);
  var E =
    window.jd && window.jd.miniProgram && /jdmp/i.test(navigator.userAgent);
  var x =
    window.xhs &&
    window.xhs.miniProgram &&
    /xhsminiapp/i.test(navigator.userAgent);
  for (
    var S,
      h = function () {
        (window.UniAppJSBridge = !0),
          document.dispatchEvent(
            new CustomEvent("UniAppJSBridgeReady", {
              bubbles: !0,
              cancelable: !0,
            })
          );
      },
      y = [
        function (e) {
          if (s || w)
            return (
              window.__uniapp_x_postMessage ||
              window.__uniapp_x_ ||
              window.__dcloud_weex_postMessage ||
              window.__dcloud_weex_
                ? document.addEventListener("DOMContentLoaded", e)
                : window.plus && u.test(document.readyState)
                ? setTimeout(e, 0)
                : document.addEventListener("plusready", e),
              d
            );
        },
        function (e) {
          if (_)
            return (
              window.WeixinJSBridge && window.WeixinJSBridge.invoke
                ? setTimeout(e, 0)
                : document.addEventListener("WeixinJSBridgeReady", e),
              window.wx.miniProgram
            );
        },
        function (e) {
          if (c)
            return (
              window.QQJSBridge && window.QQJSBridge.invoke
                ? setTimeout(e, 0)
                : document.addEventListener("QQJSBridgeReady", e),
              window.qq.miniProgram
            );
        },
        function (e) {
          if (g) {
            document.addEventListener("DOMContentLoaded", e);
            var n = window.my;
            return {
              navigateTo: n.navigateTo,
              navigateBack: n.navigateBack,
              switchTab: n.switchTab,
              reLaunch: n.reLaunch,
              redirectTo: n.redirectTo,
              postMessage: n.postMessage,
              getEnv: n.getEnv,
            };
          }
        },
        function (e) {
          if (v)
            return (
              document.addEventListener("DOMContentLoaded", e),
              window.swan.webView
            );
        },
        function (e) {
          if (p)
            return (
              document.addEventListener("DOMContentLoaded", e),
              window.tt.miniProgram
            );
        },
        function (e) {
          if (m) {
            window.QaJSBridge && window.QaJSBridge.invoke
              ? setTimeout(e, 0)
              : document.addEventListener("QaJSBridgeReady", e);
            var n = window.qa;
            return {
              navigateTo: n.navigateTo,
              navigateBack: n.navigateBack,
              switchTab: n.switchTab,
              reLaunch: n.reLaunch,
              redirectTo: n.redirectTo,
              postMessage: n.postMessage,
              getEnv: n.getEnv,
            };
          }
        },
        function (e) {
          if (f)
            return (
              window.WeixinJSBridge && window.WeixinJSBridge.invoke
                ? setTimeout(e, 0)
                : document.addEventListener("WeixinJSBridgeReady", e),
              window.ks.miniProgram
            );
        },
        function (e) {
          if (l)
            return (
              document.addEventListener("DOMContentLoaded", e),
              window.tt.miniProgram
            );
        },
        function (e) {
          if (E)
            return (
              window.JDJSBridgeReady && window.JDJSBridgeReady.invoke
                ? setTimeout(e, 0)
                : document.addEventListener("JDJSBridgeReady", e),
              window.jd.miniProgram
            );
        },
        function (e) {
          if (x) return window.xhs.miniProgram;
        },
        function (e) {
          return document.addEventListener("DOMContentLoaded", e), d;
        },
      ],
      M = 0;
    M < y.length && !(S = y[M](h));
    M++
  );
  S || (S = {});
  var P = "undefined" != typeof webUni ? webUni : {};
  if (!P.navigateTo) for (var b in S) i(S, b) && (P[b] = S[b]);
  return (P.webView = S), P;
});

whJSBridge.send2App = function (type, data, intervalCallback) {
  return new Promise((resolve, reject) => {
    try {
      const gActionCallback = `${type}_${new Date().getTime()}_${parseInt(
        Math.random() * 100,
        10
      )}`;
      var gIntervalCallback = null;
      if (intervalCallback) {
        gIntervalCallback =
          `${type}_${new Date().getTime()}_${parseInt(
            Math.random() * 100,
            10
          )}` + FLAG_INTERVAL;
        console.log("gIntervalCallback:" + gIntervalCallback);
        window[gIntervalCallback] = intervalCallback;
      }
      const timeouId = setTimeout(() => {
        reject(new Error("调用失败"));
      }, TIMEOUT_CALL);
      window[gActionCallback] = function (result) {
        clearTimeout(timeouId);
        const { flag = false, data, msg } =JSON.parse(result);
        if (flag) {
          resolve(data);
        } else {
          reject(msg);
          if (gIntervalCallback) {
            delete window[gIntervalCallback];
          }
        }
      };

      var sndData = {
        type,
        data,
        h5ActionCallback: gActionCallback,
        h5IntervalCallback: gIntervalCallback,
      };
      webUni.postMessage({
        data: sndData,
      });
    } catch (error) {
      console.error(error);
    }
  });
};

window.sendData = function (param = {}) {
  const { type = "", data, appCallback, h5Callback } = param;
  console.log("sendData");
  console.log(type);
  console.log(data);
  console.log(appCallback);
  console.log(h5Callback);
  try {
    if (type === "token") {
      store.commit("authorization/SET_TOKEN", data);
    }
  } catch (e) {
    console.error(e.message);
  } finally {
    if (type === APP_ACTION.TYPE_DELETE && h5Callback) {
      delete window[h5Callback];
      console.log("delete " + h5Callback + " ok");
      return;
    }

    if (h5Callback && window[h5Callback]) {
      try {
        window[h5Callback](data);
        if (!h5Callback.endsWith(FLAG_INTERVAL)) {
          delete window[h5Callback];
        }
      } catch (e) {
        console.error("h5Callback", e.message, e);
      }
    } else {
      console.log(h5Callback + "is null or cannot found");
    }
  }
};

window.addEventListener("message", (e) => {
  console.log(e);
  if (e.data.type == "APP_INVOKE_APPSERVICE") {
    window.sendData(e.data.data);
  }
});

whJSBridge.activeLocation = function () {
  return whJSBridge.send2App(APP_ACTION.TYPE_GET_LOCATION);
};

whJSBridge.startIntervalLocation = function (intervalLocationCallback, data) {
  return whJSBridge.send2App(
    APP_ACTION.TYPE_START_INTERVAL_LOCATION,
    data,
    intervalLocationCallback
  );
};

whJSBridge.stopIntervalLocation = function () {
  return whJSBridge.send2App(APP_ACTION.TYPE_STOP_INTERVAL_LOCATION);
};

whJSBridge.startIntervalCompass = function (intervalCompassCallback, data) {
  return whJSBridge.send2App(
    APP_ACTION.TYPE_START_INTERVAL_COMPASS,
    data,
    intervalCompassCallback
  );
};

whJSBridge.stopIntervalCompass = function () {
  return whJSBridge.send2App(APP_ACTION.TYPE_STOP_INTERVAL_COMPASS);
};

whJSBridge.startNavigation = function (data) {
  return whJSBridge.send2App(APP_ACTION.TYPE_START_NAVIGATION, data);
};

whJSBridge.stopNavigation = function () {
  return whJSBridge.send2App(APP_ACTION.TYPE_STOP_NAVIGATION);
};

whJSBridge.startRecord = function (intervalCompassCallback) {
  return whJSBridge.send2App(APP_ACTION.TYPE_START_RECORD, "",intervalCompassCallback);
};

whJSBridge.stopRecord = function () {
  return whJSBridge.send2App(APP_ACTION.TYPE_STOP_RECORD);
};

whJSBridge.previewDocument = function (data) {
  return whJSBridge.send2App(APP_ACTION.TYPE_PREVIEW_DOCUMENT, data, null);
};

whJSBridge.printLog = function (data) {
  return whJSBridge.send2App(APP_ACTION.TYPE_PRINT, data, null);
};

whJSBridge.getToken = function () {
  return whJSBridge.send2App(APP_ACTION.TYPE_GET_TOKEN);
};

whJSBridge.refreshToken = function () {
  return whJSBridge.send2App(APP_ACTION.TYPE_REFRESH_TOKEN);
};

whJSBridge.goBack = function () {
  return whJSBridge.send2App(APP_ACTION.TYPE_GO_BACK);
};
whJSBridge.startFullScreen = function () {
  return whJSBridge.send2App(APP_ACTION.TYPE_START_FULL_SCREEN, null, null);
};

whJSBridge.stopFullScreen = function () {
  return whJSBridge.send2App(APP_ACTION.TYPE_STOP_FULL_SCREEN);
};

whJSBridge.chooseLocation = function () {
  return whJSBridge.send2App(APP_ACTION.TYPE_CHOSE_LOCATION);
};

whJSBridge.getMedia = function (dataCallback, data) {
  return whJSBridge.send2App(APP_ACTION.TYPE_GET_MEDIA, data, dataCallback);
};
whJSBridge.getImgBase64 = function (dataCallback, data) {
  return whJSBridge.send2App(
    APP_ACTION.TYPE_GET_IMG_BASE64,
    data,
    dataCallback
  );
};

whJSBridge.getFile = function (dataCallback) {
  return whJSBridge.send2App(APP_ACTION.TYPE_GET_FILE, "", dataCallback);
};

whJSBridge.callPhone = function (data) {
  return whJSBridge.send2App(APP_ACTION.TYPE_CALL_PHONE, data, null);
};
whJSBridge.sendSMS = function (data) {
  return whJSBridge.send2App(APP_ACTION.TYPE_SEND_SMS, data, null);
};
whJSBridge.sendEmail = function (data) {
  return whJSBridge.send2App(APP_ACTION.TYPE_SEND_EMAIL, data, null);
};
whJSBridge.scanQRCode = function () {
  return whJSBridge.send2App(APP_ACTION.TYPE_SCAN_QRCODE, null, null);
};
whJSBridge.getNetType = function () {
  return whJSBridge.send2App(APP_ACTION.TYPE_GET_NETTYPE, null, null);
};
whJSBridge.parseAddr = function (data) {
  return whJSBridge.send2App(APP_ACTION.TYPE_ADDR_PARSE, data, null);
};

whJSBridge.downloadFile = function (data) {
  return whJSBridge.send2App(APP_ACTION.TYPE_DOWNLOAD_FILE, data, null);
};


whJSBridge.uploadFile = function (data) {
  return whJSBridge.send2App(APP_ACTION.TYPE_UPLOAD_FILE, data, null);
};


window.whJSBridge = whJSBridge;
// module.exports = whJSBridge;
